{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Horseshoe Prior\n",
    "\n",
    "In this example, we will use the Horseshoe Prior (Carvalho et al., 2009) to model a large number of variables, with only a few slopes being significantly different from zero. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import arviz as az\n",
    "import bambi as bmb\n",
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here is what we did:\n",
    "\n",
    "* We defined an intercept.\n",
    "* We defined a vector of 50 betas, 5 of which were drawn from a normal(5,1) distribution, and then assigned a random sign.\n",
    "* We created the design matrix with normal(0,1) entries and set $\\sigma$ to 1.\n",
    "* We calculated the deterministic means $\\mu$ using the intercept and the design matrix multiplied by the betas.\n",
    "* We simulated 100 response variables (observations) from a normal distribution with mean $\\mu$ and standard deviation $\\sigma$.\n",
    "\n",
    "Next, we proceeded with the Bayesian estimation of the model. We proposed the horseshoe prior, for which the following parameters were calculated:\n",
    "\n",
    "$$\\mu_i = \\alpha + \\beta_1 x_{1i} + \\beta_2 x_{2i} + ... + \\beta_p x_{pi}$$\n",
    "\n",
    "$$y_i \\sim N(\\mu_i, \\sigma^2)$$\n",
    "\n",
    "$$\\alpha \\sim N(0,1)$$\n",
    "\n",
    "$$\\beta_j \\sim N(0,\\lambda_j^2 \\tau^2)$$\n",
    "\n",
    "$$\\lambda_j \\sim C^+(0,1)$$\n",
    "\n",
    "$$\\tau \\sim T^+(df=3)$$\n",
    "\n",
    "$$\\sigma^2 \\sim N^+(0,1)$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "D = 50\n",
    "D0 = 5\n",
    "\n",
    "SEED = 123456789 # for reproducibility\n",
    "\n",
    "rng = np.random.default_rng(SEED)\n",
    "\n",
    "INTERCEPT = rng.uniform(-3, 3) # simulate an intercept\n",
    "\n",
    "COEF = np.zeros(D)\n",
    "# Simulate the slopes for significant variables\n",
    "COEF[:D0] = rng.choice([-1, 1], size=D0) * rng.normal(5, 1, size=D0)\n",
    "\n",
    "N = 100\n",
    "X = rng.normal(size=(N, D))\n",
    "SIGMA = 1.0\n",
    "\n",
    "# Simulate the data\n",
    "y = INTERCEPT + X.dot(COEF) + rng.normal(0, SIGMA, size=N)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here we create the dataframe and the term name for the set of variables, to define the formula. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame(X)\n",
    "df.columns = [f\"x{i}\" for i in range(X.shape[1])]\n",
    "df[\"y\"] = y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'y ~ c(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, x48, x49)'"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "term_name = \"c(\" + \", \".join([f\"x{i}\" for i in range(X.shape[1])]) + \")\"\n",
    "formula = f\"y ~ {term_name}\"\n",
    "formula"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, we call the Horseshoe prior and create the model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ERROR (pytensor.graph.rewriting.basic): Rewrite failure due to: random_make_inplace\n",
      "ERROR (pytensor.graph.rewriting.basic): node: t_rv{\"(),(),()->()\"}(*0-<RandomGeneratorType>, *1-<NoneTypeT>, *2-<Scalar(float64, shape=())>, 0.0, *3-<Scalar(float64, shape=())>)\n",
      "ERROR (pytensor.graph.rewriting.basic): TRACEBACK:\n",
      "ERROR (pytensor.graph.rewriting.basic): Traceback (most recent call last):\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1933, in process_node\n",
      "    replacements = node_rewriter.transform(fgraph, node)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1086, in transform\n",
      "    return self.fn(fgraph, node)\n",
      "           ~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/rewriting/basic.py\", line 50, in random_make_inplace\n",
      "    new_outputs = new_op.make_node(*node.inputs).outputs\n",
      "                  ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/op.py\", line 368, in make_node\n",
      "    size = normalize_size_param(size)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/utils.py\", line 190, in normalize_size_param\n",
      "    shape = cast(as_tensor_variable(shape, ndim=1, dtype=\"int64\"), \"int64\")\n",
      "                 ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/__init__.py\", line 50, in as_tensor_variable\n",
      "    return _as_tensor_variable(x, name, ndim, **kwargs)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/functools.py\", line 934, in wrapper\n",
      "    return dispatch(args[0].__class__)(*args, **kw)\n",
      "           ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/basic.py\", line 113, in _as_tensor_Variable\n",
      "    raise TypeError(\n",
      "        f\"Tensor type field must be a TensorType; found {type(x.type)}.\"\n",
      "    )\n",
      "TypeError: Tensor type field must be a TensorType; found <class 'pytensor.tensor.type_other.NoneTypeT'>.\n",
      "\n",
      "ERROR (pytensor.graph.rewriting.basic): Rewrite failure due to: random_make_inplace\n",
      "ERROR (pytensor.graph.rewriting.basic): node: t_rv{\"(),(),()->()\"}(*0-<RandomGeneratorType>, *1-<NoneTypeT>, *2-<Scalar(int8, shape=())>, 0.0, *3-<Scalar(float32, shape=())>)\n",
      "ERROR (pytensor.graph.rewriting.basic): TRACEBACK:\n",
      "ERROR (pytensor.graph.rewriting.basic): Traceback (most recent call last):\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1933, in process_node\n",
      "    replacements = node_rewriter.transform(fgraph, node)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1086, in transform\n",
      "    return self.fn(fgraph, node)\n",
      "           ~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/rewriting/basic.py\", line 50, in random_make_inplace\n",
      "    new_outputs = new_op.make_node(*node.inputs).outputs\n",
      "                  ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/op.py\", line 368, in make_node\n",
      "    size = normalize_size_param(size)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/utils.py\", line 190, in normalize_size_param\n",
      "    shape = cast(as_tensor_variable(shape, ndim=1, dtype=\"int64\"), \"int64\")\n",
      "                 ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/__init__.py\", line 50, in as_tensor_variable\n",
      "    return _as_tensor_variable(x, name, ndim, **kwargs)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/functools.py\", line 934, in wrapper\n",
      "    return dispatch(args[0].__class__)(*args, **kw)\n",
      "           ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/basic.py\", line 113, in _as_tensor_Variable\n",
      "    raise TypeError(\n",
      "        f\"Tensor type field must be a TensorType; found {type(x.type)}.\"\n",
      "    )\n",
      "TypeError: Tensor type field must be a TensorType; found <class 'pytensor.tensor.type_other.NoneTypeT'>.\n",
      "\n",
      "ERROR (pytensor.graph.rewriting.basic): Rewrite failure due to: random_make_inplace\n",
      "ERROR (pytensor.graph.rewriting.basic): node: t_rv{\"(),(),()->()\"}(*0-<RandomGeneratorType>, *1-<NoneTypeT>, *2-<Scalar(int8, shape=())>, 0.0, *3-<Scalar(float32, shape=())>)\n",
      "ERROR (pytensor.graph.rewriting.basic): TRACEBACK:\n",
      "ERROR (pytensor.graph.rewriting.basic): Traceback (most recent call last):\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1933, in process_node\n",
      "    replacements = node_rewriter.transform(fgraph, node)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1086, in transform\n",
      "    return self.fn(fgraph, node)\n",
      "           ~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/rewriting/basic.py\", line 50, in random_make_inplace\n",
      "    new_outputs = new_op.make_node(*node.inputs).outputs\n",
      "                  ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/op.py\", line 368, in make_node\n",
      "    size = normalize_size_param(size)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/utils.py\", line 190, in normalize_size_param\n",
      "    shape = cast(as_tensor_variable(shape, ndim=1, dtype=\"int64\"), \"int64\")\n",
      "                 ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/__init__.py\", line 50, in as_tensor_variable\n",
      "    return _as_tensor_variable(x, name, ndim, **kwargs)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/functools.py\", line 934, in wrapper\n",
      "    return dispatch(args[0].__class__)(*args, **kw)\n",
      "           ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/basic.py\", line 113, in _as_tensor_Variable\n",
      "    raise TypeError(\n",
      "        f\"Tensor type field must be a TensorType; found {type(x.type)}.\"\n",
      "    )\n",
      "TypeError: Tensor type field must be a TensorType; found <class 'pytensor.tensor.type_other.NoneTypeT'>.\n",
      "\n",
      "ERROR (pytensor.graph.rewriting.basic): Rewrite failure due to: random_make_inplace\n",
      "ERROR (pytensor.graph.rewriting.basic): node: t_rv{\"(),(),()->()\"}(*0-<RandomGeneratorType>, *1-<NoneTypeT>, *2-<Scalar(int8, shape=())>, 0.0, *3-<Scalar(float32, shape=())>)\n",
      "ERROR (pytensor.graph.rewriting.basic): TRACEBACK:\n",
      "ERROR (pytensor.graph.rewriting.basic): Traceback (most recent call last):\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1933, in process_node\n",
      "    replacements = node_rewriter.transform(fgraph, node)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1086, in transform\n",
      "    return self.fn(fgraph, node)\n",
      "           ~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/rewriting/basic.py\", line 50, in random_make_inplace\n",
      "    new_outputs = new_op.make_node(*node.inputs).outputs\n",
      "                  ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/op.py\", line 368, in make_node\n",
      "    size = normalize_size_param(size)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/utils.py\", line 190, in normalize_size_param\n",
      "    shape = cast(as_tensor_variable(shape, ndim=1, dtype=\"int64\"), \"int64\")\n",
      "                 ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/__init__.py\", line 50, in as_tensor_variable\n",
      "    return _as_tensor_variable(x, name, ndim, **kwargs)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/functools.py\", line 934, in wrapper\n",
      "    return dispatch(args[0].__class__)(*args, **kw)\n",
      "           ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/basic.py\", line 113, in _as_tensor_Variable\n",
      "    raise TypeError(\n",
      "        f\"Tensor type field must be a TensorType; found {type(x.type)}.\"\n",
      "    )\n",
      "TypeError: Tensor type field must be a TensorType; found <class 'pytensor.tensor.type_other.NoneTypeT'>.\n",
      "\n",
      "ERROR (pytensor.graph.rewriting.basic): Rewrite failure due to: random_make_inplace\n",
      "ERROR (pytensor.graph.rewriting.basic): node: t_rv{\"(),(),()->()\"}(*0-<RandomGeneratorType>, *1-<NoneTypeT>, *2-<Scalar(float64, shape=())>, 0.0, *3-<Scalar(float64, shape=())>)\n",
      "ERROR (pytensor.graph.rewriting.basic): TRACEBACK:\n",
      "ERROR (pytensor.graph.rewriting.basic): Traceback (most recent call last):\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1933, in process_node\n",
      "    replacements = node_rewriter.transform(fgraph, node)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1086, in transform\n",
      "    return self.fn(fgraph, node)\n",
      "           ~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/rewriting/basic.py\", line 50, in random_make_inplace\n",
      "    new_outputs = new_op.make_node(*node.inputs).outputs\n",
      "                  ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/op.py\", line 368, in make_node\n",
      "    size = normalize_size_param(size)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/utils.py\", line 190, in normalize_size_param\n",
      "    shape = cast(as_tensor_variable(shape, ndim=1, dtype=\"int64\"), \"int64\")\n",
      "                 ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/__init__.py\", line 50, in as_tensor_variable\n",
      "    return _as_tensor_variable(x, name, ndim, **kwargs)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/functools.py\", line 934, in wrapper\n",
      "    return dispatch(args[0].__class__)(*args, **kw)\n",
      "           ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/basic.py\", line 113, in _as_tensor_Variable\n",
      "    raise TypeError(\n",
      "        f\"Tensor type field must be a TensorType; found {type(x.type)}.\"\n",
      "    )\n",
      "TypeError: Tensor type field must be a TensorType; found <class 'pytensor.tensor.type_other.NoneTypeT'>.\n",
      "\n",
      "ERROR (pytensor.graph.rewriting.basic): Rewrite failure due to: random_make_inplace\n",
      "ERROR (pytensor.graph.rewriting.basic): node: t_rv{\"(),(),()->()\"}(*0-<RandomGeneratorType>, *1-<NoneTypeT>, *2-<Scalar(int8, shape=())>, 0.0, *3-<Scalar(float32, shape=())>)\n",
      "ERROR (pytensor.graph.rewriting.basic): TRACEBACK:\n",
      "ERROR (pytensor.graph.rewriting.basic): Traceback (most recent call last):\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1933, in process_node\n",
      "    replacements = node_rewriter.transform(fgraph, node)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1086, in transform\n",
      "    return self.fn(fgraph, node)\n",
      "           ~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/rewriting/basic.py\", line 50, in random_make_inplace\n",
      "    new_outputs = new_op.make_node(*node.inputs).outputs\n",
      "                  ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/op.py\", line 368, in make_node\n",
      "    size = normalize_size_param(size)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/utils.py\", line 190, in normalize_size_param\n",
      "    shape = cast(as_tensor_variable(shape, ndim=1, dtype=\"int64\"), \"int64\")\n",
      "                 ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/__init__.py\", line 50, in as_tensor_variable\n",
      "    return _as_tensor_variable(x, name, ndim, **kwargs)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/functools.py\", line 934, in wrapper\n",
      "    return dispatch(args[0].__class__)(*args, **kw)\n",
      "           ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/basic.py\", line 113, in _as_tensor_Variable\n",
      "    raise TypeError(\n",
      "        f\"Tensor type field must be a TensorType; found {type(x.type)}.\"\n",
      "    )\n",
      "TypeError: Tensor type field must be a TensorType; found <class 'pytensor.tensor.type_other.NoneTypeT'>.\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.43.0 (0)\n",
       " -->\n",
       "<!-- Title: %3 Pages: 1 -->\n",
       "<svg width=\"698pt\" height=\"471pt\"\n",
       " viewBox=\"0.00 0.00 697.54 470.81\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 466.81)\">\n",
       "<title>%3</title>\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-466.81 693.54,-466.81 693.54,4 -4,4\"/>\n",
       "<g id=\"clust1\" class=\"cluster\">\n",
       "<title>clusterpredictors_dim (50)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M137.69,-240.88C137.69,-240.88 497.69,-240.88 497.69,-240.88 503.69,-240.88 509.69,-246.88 509.69,-252.88 509.69,-252.88 509.69,-442.81 509.69,-442.81 509.69,-448.81 503.69,-454.81 497.69,-454.81 497.69,-454.81 137.69,-454.81 137.69,-454.81 131.69,-454.81 125.69,-448.81 125.69,-442.81 125.69,-442.81 125.69,-252.88 125.69,-252.88 125.69,-246.88 131.69,-240.88 137.69,-240.88\"/>\n",
       "<text text-anchor=\"middle\" x=\"431.19\" y=\"-248.68\" font-family=\"Times,serif\" font-size=\"14.00\">predictors_dim (50)</text>\n",
       "</g>\n",
       "<g id=\"clust2\" class=\"cluster\">\n",
       "<title>cluster__obs__ (100)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M79.69,-8C79.69,-8 185.69,-8 185.69,-8 191.69,-8 197.69,-14 197.69,-20 197.69,-20 197.69,-209.93 197.69,-209.93 197.69,-215.93 191.69,-221.93 185.69,-221.93 185.69,-221.93 79.69,-221.93 79.69,-221.93 73.69,-221.93 67.69,-215.93 67.69,-209.93 67.69,-209.93 67.69,-20 67.69,-20 67.69,-14 73.69,-8 79.69,-8\"/>\n",
       "<text text-anchor=\"middle\" x=\"142.69\" y=\"-15.8\" font-family=\"Times,serif\" font-size=\"14.00\">__obs__ (100)</text>\n",
       "</g>\n",
       "<!-- Intercept -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>Intercept</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"58.69\" cy=\"-298.38\" rx=\"58.88\" ry=\"37.45\"/>\n",
       "<text text-anchor=\"middle\" x=\"58.69\" y=\"-309.68\" font-family=\"Times,serif\" font-size=\"14.00\">Intercept</text>\n",
       "<text text-anchor=\"middle\" x=\"58.69\" y=\"-294.68\" font-family=\"Times,serif\" font-size=\"14.00\">~</text>\n",
       "<text text-anchor=\"middle\" x=\"58.69\" y=\"-279.68\" font-family=\"Times,serif\" font-size=\"14.00\">Normal</text>\n",
       "</g>\n",
       "<!-- mu -->\n",
       "<g id=\"node8\" class=\"node\">\n",
       "<title>mu</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" points=\"189.69,-213.93 75.69,-213.93 75.69,-160.93 189.69,-160.93 189.69,-213.93\"/>\n",
       "<text text-anchor=\"middle\" x=\"132.69\" y=\"-198.73\" font-family=\"Times,serif\" font-size=\"14.00\">mu</text>\n",
       "<text text-anchor=\"middle\" x=\"132.69\" y=\"-183.73\" font-family=\"Times,serif\" font-size=\"14.00\">~</text>\n",
       "<text text-anchor=\"middle\" x=\"132.69\" y=\"-168.73\" font-family=\"Times,serif\" font-size=\"14.00\">Deterministic</text>\n",
       "</g>\n",
       "<!-- Intercept&#45;&gt;mu -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>Intercept&#45;&gt;mu</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M81.5,-263.8C90.41,-250.67 100.63,-235.63 109.58,-222.46\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"112.52,-224.35 115.25,-214.11 106.73,-220.42 112.52,-224.35\"/>\n",
       "</g>\n",
       "<!-- predictors_tau -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>predictors_tau</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"604.69\" cy=\"-409.34\" rx=\"84.71\" ry=\"37.45\"/>\n",
       "<text text-anchor=\"middle\" x=\"604.69\" y=\"-420.64\" font-family=\"Times,serif\" font-size=\"14.00\">predictors_tau</text>\n",
       "<text text-anchor=\"middle\" x=\"604.69\" y=\"-405.64\" font-family=\"Times,serif\" font-size=\"14.00\">~</text>\n",
       "<text text-anchor=\"middle\" x=\"604.69\" y=\"-390.64\" font-family=\"Times,serif\" font-size=\"14.00\">Halfstudentt</text>\n",
       "</g>\n",
       "<!-- predictors -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>predictors</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" points=\"373.69,-324.88 259.69,-324.88 259.69,-271.88 373.69,-271.88 373.69,-324.88\"/>\n",
       "<text text-anchor=\"middle\" x=\"316.69\" y=\"-309.68\" font-family=\"Times,serif\" font-size=\"14.00\">predictors</text>\n",
       "<text text-anchor=\"middle\" x=\"316.69\" y=\"-294.68\" font-family=\"Times,serif\" font-size=\"14.00\">~</text>\n",
       "<text text-anchor=\"middle\" x=\"316.69\" y=\"-279.68\" font-family=\"Times,serif\" font-size=\"14.00\">Deterministic</text>\n",
       "</g>\n",
       "<!-- predictors_tau&#45;&gt;predictors -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>predictors_tau&#45;&gt;predictors</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M543.11,-383.37C533.29,-379.47 523.22,-375.52 513.69,-371.86 470.41,-355.23 421.5,-337.23 383.24,-323.33\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"384.34,-320.01 373.75,-319.89 381.96,-326.59 384.34,-320.01\"/>\n",
       "</g>\n",
       "<!-- sigma -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>sigma</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"283.69\" cy=\"-187.43\" rx=\"75.82\" ry=\"37.45\"/>\n",
       "<text text-anchor=\"middle\" x=\"283.69\" y=\"-198.73\" font-family=\"Times,serif\" font-size=\"14.00\">sigma</text>\n",
       "<text text-anchor=\"middle\" x=\"283.69\" y=\"-183.73\" font-family=\"Times,serif\" font-size=\"14.00\">~</text>\n",
       "<text text-anchor=\"middle\" x=\"283.69\" y=\"-168.73\" font-family=\"Times,serif\" font-size=\"14.00\">Halfstudentt</text>\n",
       "</g>\n",
       "<!-- y -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>y</title>\n",
       "<ellipse fill=\"lightgrey\" stroke=\"black\" cx=\"136.69\" cy=\"-76.48\" rx=\"49.49\" ry=\"37.45\"/>\n",
       "<text text-anchor=\"middle\" x=\"136.69\" y=\"-87.78\" font-family=\"Times,serif\" font-size=\"14.00\">y</text>\n",
       "<text text-anchor=\"middle\" x=\"136.69\" y=\"-72.78\" font-family=\"Times,serif\" font-size=\"14.00\">~</text>\n",
       "<text text-anchor=\"middle\" x=\"136.69\" y=\"-57.78\" font-family=\"Times,serif\" font-size=\"14.00\">Normal</text>\n",
       "</g>\n",
       "<!-- sigma&#45;&gt;y -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>sigma&#45;&gt;y</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M242.35,-155.79C222.88,-141.36 199.67,-124.15 179.96,-109.55\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"181.87,-106.61 171.75,-103.46 177.7,-112.23 181.87,-106.61\"/>\n",
       "</g>\n",
       "<!-- predictors_raw -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>predictors_raw</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"413.69\" cy=\"-409.34\" rx=\"87.86\" ry=\"37.45\"/>\n",
       "<text text-anchor=\"middle\" x=\"413.69\" y=\"-420.64\" font-family=\"Times,serif\" font-size=\"14.00\">predictors_raw</text>\n",
       "<text text-anchor=\"middle\" x=\"413.69\" y=\"-405.64\" font-family=\"Times,serif\" font-size=\"14.00\">~</text>\n",
       "<text text-anchor=\"middle\" x=\"413.69\" y=\"-390.64\" font-family=\"Times,serif\" font-size=\"14.00\">Normal</text>\n",
       "</g>\n",
       "<!-- predictors_raw&#45;&gt;predictors -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>predictors_raw&#45;&gt;predictors</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M383.26,-374.16C371.47,-360.91 358.01,-345.79 346.29,-332.63\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"348.88,-330.28 339.62,-325.14 343.65,-334.93 348.88,-330.28\"/>\n",
       "</g>\n",
       "<!-- predictors_lam -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>predictors_lam</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"220.69\" cy=\"-409.34\" rx=\"86.95\" ry=\"37.45\"/>\n",
       "<text text-anchor=\"middle\" x=\"220.69\" y=\"-420.64\" font-family=\"Times,serif\" font-size=\"14.00\">predictors_lam</text>\n",
       "<text text-anchor=\"middle\" x=\"220.69\" y=\"-405.64\" font-family=\"Times,serif\" font-size=\"14.00\">~</text>\n",
       "<text text-anchor=\"middle\" x=\"220.69\" y=\"-390.64\" font-family=\"Times,serif\" font-size=\"14.00\">Halfstudentt</text>\n",
       "</g>\n",
       "<!-- predictors_lam&#45;&gt;predictors -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>predictors_lam&#45;&gt;predictors</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M250.8,-374.16C262.37,-361.04 275.55,-346.07 287.07,-333\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"290.01,-334.95 294,-325.14 284.76,-330.32 290.01,-334.95\"/>\n",
       "</g>\n",
       "<!-- predictors&#45;&gt;mu -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>predictors&#45;&gt;mu</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M273.55,-271.84C247,-256.12 212.8,-235.87 184.75,-219.26\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"186.27,-216.09 175.88,-214 182.7,-222.11 186.27,-216.09\"/>\n",
       "</g>\n",
       "<!-- mu&#45;&gt;y -->\n",
       "<g id=\"edge7\" class=\"edge\">\n",
       "<title>mu&#45;&gt;y</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M133.63,-160.89C134.03,-149.98 134.51,-136.89 134.97,-124.35\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"138.48,-124.12 135.35,-114 131.48,-123.87 138.48,-124.12\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<graphviz.graphs.Digraph at 0x7faa79974ad0>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "priors = {\n",
    "    term_name: bmb.Prior(\"Horseshoe\"),\n",
    "}\n",
    "model = bmb.Model(formula, df, priors=priors)\n",
    "model.set_alias({term_name: \"predictors\"})\n",
    "\n",
    "model.build()\n",
    "model.graph()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Initializing NUTS using jitter+adapt_diag...\n",
      "Multiprocess sampling (2 chains in 2 jobs)\n",
      "NUTS: [sigma, Intercept, predictors_tau, predictors_lam, predictors_raw]\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c3158e4316fc4302ab3cae26f85b2ed0",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Sampling 2 chains for 1_000 tune and 1_000 draw iterations (2_000 + 2_000 draws total) took 97 seconds.\n",
      "There were 107 divergences after tuning. Increase `target_accept` or reparameterize.\n",
      "We recommend running at least 4 chains for robust computation of convergence diagnostics\n"
     ]
    }
   ],
   "source": [
    "idata = model.fit(target_accept = 0.95, chains=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ERROR (pytensor.graph.rewriting.basic): Rewrite failure due to: random_make_inplace\n",
      "ERROR (pytensor.graph.rewriting.basic): node: t_rv{\"(),(),()->()\"}(*0-<RandomGeneratorType>, *1-<NoneTypeT>, *2-<Scalar(float64, shape=())>, 0.0, *3-<Scalar(float64, shape=())>)\n",
      "ERROR (pytensor.graph.rewriting.basic): TRACEBACK:\n",
      "ERROR (pytensor.graph.rewriting.basic): Traceback (most recent call last):\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1933, in process_node\n",
      "    replacements = node_rewriter.transform(fgraph, node)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1086, in transform\n",
      "    return self.fn(fgraph, node)\n",
      "           ~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/rewriting/basic.py\", line 50, in random_make_inplace\n",
      "    new_outputs = new_op.make_node(*node.inputs).outputs\n",
      "                  ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/op.py\", line 368, in make_node\n",
      "    size = normalize_size_param(size)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/utils.py\", line 190, in normalize_size_param\n",
      "    shape = cast(as_tensor_variable(shape, ndim=1, dtype=\"int64\"), \"int64\")\n",
      "                 ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/__init__.py\", line 50, in as_tensor_variable\n",
      "    return _as_tensor_variable(x, name, ndim, **kwargs)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/functools.py\", line 934, in wrapper\n",
      "    return dispatch(args[0].__class__)(*args, **kw)\n",
      "           ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/basic.py\", line 113, in _as_tensor_Variable\n",
      "    raise TypeError(\n",
      "        f\"Tensor type field must be a TensorType; found {type(x.type)}.\"\n",
      "    )\n",
      "TypeError: Tensor type field must be a TensorType; found <class 'pytensor.tensor.type_other.NoneTypeT'>.\n",
      "\n",
      "ERROR (pytensor.graph.rewriting.basic): Rewrite failure due to: random_make_inplace\n",
      "ERROR (pytensor.graph.rewriting.basic): node: t_rv{\"(),(),()->()\"}(*0-<RandomGeneratorType>, *1-<NoneTypeT>, *2-<Scalar(float64, shape=())>, 0.0, *3-<Scalar(float32, shape=())>)\n",
      "ERROR (pytensor.graph.rewriting.basic): TRACEBACK:\n",
      "ERROR (pytensor.graph.rewriting.basic): Traceback (most recent call last):\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1933, in process_node\n",
      "    replacements = node_rewriter.transform(fgraph, node)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1086, in transform\n",
      "    return self.fn(fgraph, node)\n",
      "           ~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/rewriting/basic.py\", line 50, in random_make_inplace\n",
      "    new_outputs = new_op.make_node(*node.inputs).outputs\n",
      "                  ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/op.py\", line 368, in make_node\n",
      "    size = normalize_size_param(size)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/utils.py\", line 190, in normalize_size_param\n",
      "    shape = cast(as_tensor_variable(shape, ndim=1, dtype=\"int64\"), \"int64\")\n",
      "                 ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/__init__.py\", line 50, in as_tensor_variable\n",
      "    return _as_tensor_variable(x, name, ndim, **kwargs)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/functools.py\", line 934, in wrapper\n",
      "    return dispatch(args[0].__class__)(*args, **kw)\n",
      "           ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/basic.py\", line 113, in _as_tensor_Variable\n",
      "    raise TypeError(\n",
      "        f\"Tensor type field must be a TensorType; found {type(x.type)}.\"\n",
      "    )\n",
      "TypeError: Tensor type field must be a TensorType; found <class 'pytensor.tensor.type_other.NoneTypeT'>.\n",
      "\n",
      "ERROR (pytensor.graph.rewriting.basic): Rewrite failure due to: random_make_inplace\n",
      "ERROR (pytensor.graph.rewriting.basic): node: t_rv{\"(),(),()->()\"}(*0-<RandomGeneratorType>, *1-<NoneTypeT>, *2-<Scalar(float64, shape=())>, 0.0, *3-<Scalar(float32, shape=())>)\n",
      "ERROR (pytensor.graph.rewriting.basic): TRACEBACK:\n",
      "ERROR (pytensor.graph.rewriting.basic): Traceback (most recent call last):\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1933, in process_node\n",
      "    replacements = node_rewriter.transform(fgraph, node)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1086, in transform\n",
      "    return self.fn(fgraph, node)\n",
      "           ~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/rewriting/basic.py\", line 50, in random_make_inplace\n",
      "    new_outputs = new_op.make_node(*node.inputs).outputs\n",
      "                  ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/op.py\", line 368, in make_node\n",
      "    size = normalize_size_param(size)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/utils.py\", line 190, in normalize_size_param\n",
      "    shape = cast(as_tensor_variable(shape, ndim=1, dtype=\"int64\"), \"int64\")\n",
      "                 ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/__init__.py\", line 50, in as_tensor_variable\n",
      "    return _as_tensor_variable(x, name, ndim, **kwargs)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/functools.py\", line 934, in wrapper\n",
      "    return dispatch(args[0].__class__)(*args, **kw)\n",
      "           ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/basic.py\", line 113, in _as_tensor_Variable\n",
      "    raise TypeError(\n",
      "        f\"Tensor type field must be a TensorType; found {type(x.type)}.\"\n",
      "    )\n",
      "TypeError: Tensor type field must be a TensorType; found <class 'pytensor.tensor.type_other.NoneTypeT'>.\n",
      "\n",
      "ERROR (pytensor.graph.rewriting.basic): Rewrite failure due to: random_make_inplace\n",
      "ERROR (pytensor.graph.rewriting.basic): node: t_rv{\"(),(),()->()\"}(*0-<RandomGeneratorType>, *1-<NoneTypeT>, *2-<Scalar(float64, shape=())>, 0.0, *3-<Scalar(float32, shape=())>)\n",
      "ERROR (pytensor.graph.rewriting.basic): TRACEBACK:\n",
      "ERROR (pytensor.graph.rewriting.basic): Traceback (most recent call last):\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1933, in process_node\n",
      "    replacements = node_rewriter.transform(fgraph, node)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1086, in transform\n",
      "    return self.fn(fgraph, node)\n",
      "           ~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/rewriting/basic.py\", line 50, in random_make_inplace\n",
      "    new_outputs = new_op.make_node(*node.inputs).outputs\n",
      "                  ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/op.py\", line 368, in make_node\n",
      "    size = normalize_size_param(size)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/utils.py\", line 190, in normalize_size_param\n",
      "    shape = cast(as_tensor_variable(shape, ndim=1, dtype=\"int64\"), \"int64\")\n",
      "                 ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/__init__.py\", line 50, in as_tensor_variable\n",
      "    return _as_tensor_variable(x, name, ndim, **kwargs)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/functools.py\", line 934, in wrapper\n",
      "    return dispatch(args[0].__class__)(*args, **kw)\n",
      "           ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/basic.py\", line 113, in _as_tensor_Variable\n",
      "    raise TypeError(\n",
      "        f\"Tensor type field must be a TensorType; found {type(x.type)}.\"\n",
      "    )\n",
      "TypeError: Tensor type field must be a TensorType; found <class 'pytensor.tensor.type_other.NoneTypeT'>.\n",
      "\n",
      "ERROR (pytensor.graph.rewriting.basic): Rewrite failure due to: random_make_inplace\n",
      "ERROR (pytensor.graph.rewriting.basic): node: t_rv{\"(),(),()->()\"}(*0-<RandomGeneratorType>, *1-<NoneTypeT>, *2-<Scalar(float64, shape=())>, 0.0, *3-<Scalar(float64, shape=())>)\n",
      "ERROR (pytensor.graph.rewriting.basic): TRACEBACK:\n",
      "ERROR (pytensor.graph.rewriting.basic): Traceback (most recent call last):\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1933, in process_node\n",
      "    replacements = node_rewriter.transform(fgraph, node)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1086, in transform\n",
      "    return self.fn(fgraph, node)\n",
      "           ~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/rewriting/basic.py\", line 50, in random_make_inplace\n",
      "    new_outputs = new_op.make_node(*node.inputs).outputs\n",
      "                  ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/op.py\", line 368, in make_node\n",
      "    size = normalize_size_param(size)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/utils.py\", line 190, in normalize_size_param\n",
      "    shape = cast(as_tensor_variable(shape, ndim=1, dtype=\"int64\"), \"int64\")\n",
      "                 ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/__init__.py\", line 50, in as_tensor_variable\n",
      "    return _as_tensor_variable(x, name, ndim, **kwargs)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/functools.py\", line 934, in wrapper\n",
      "    return dispatch(args[0].__class__)(*args, **kw)\n",
      "           ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/basic.py\", line 113, in _as_tensor_Variable\n",
      "    raise TypeError(\n",
      "        f\"Tensor type field must be a TensorType; found {type(x.type)}.\"\n",
      "    )\n",
      "TypeError: Tensor type field must be a TensorType; found <class 'pytensor.tensor.type_other.NoneTypeT'>.\n",
      "\n",
      "ERROR (pytensor.graph.rewriting.basic): Rewrite failure due to: random_make_inplace\n",
      "ERROR (pytensor.graph.rewriting.basic): node: t_rv{\"(),(),()->()\"}(*0-<RandomGeneratorType>, *1-<NoneTypeT>, *2-<Scalar(float64, shape=())>, 0.0, *3-<Scalar(float32, shape=())>)\n",
      "ERROR (pytensor.graph.rewriting.basic): TRACEBACK:\n",
      "ERROR (pytensor.graph.rewriting.basic): Traceback (most recent call last):\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1933, in process_node\n",
      "    replacements = node_rewriter.transform(fgraph, node)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/graph/rewriting/basic.py\", line 1086, in transform\n",
      "    return self.fn(fgraph, node)\n",
      "           ~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/rewriting/basic.py\", line 50, in random_make_inplace\n",
      "    new_outputs = new_op.make_node(*node.inputs).outputs\n",
      "                  ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/op.py\", line 368, in make_node\n",
      "    size = normalize_size_param(size)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/random/utils.py\", line 190, in normalize_size_param\n",
      "    shape = cast(as_tensor_variable(shape, ndim=1, dtype=\"int64\"), \"int64\")\n",
      "                 ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/__init__.py\", line 50, in as_tensor_variable\n",
      "    return _as_tensor_variable(x, name, ndim, **kwargs)\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/functools.py\", line 934, in wrapper\n",
      "    return dispatch(args[0].__class__)(*args, **kw)\n",
      "           ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n",
      "  File \"/home/tomas/oss/bambinos/bambi/.pixi/envs/dev/lib/python3.13/site-packages/pytensor/tensor/basic.py\", line 113, in _as_tensor_Variable\n",
      "    raise TypeError(\n",
      "        f\"Tensor type field must be a TensorType; found {type(x.type)}.\"\n",
      "    )\n",
      "TypeError: Tensor type field must be a TensorType; found <class 'pytensor.tensor.type_other.NoneTypeT'>.\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.43.0 (0)\n",
       " -->\n",
       "<!-- Title: %3 Pages: 1 -->\n",
       "<svg width=\"698pt\" height=\"471pt\"\n",
       " viewBox=\"0.00 0.00 697.54 470.81\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 466.81)\">\n",
       "<title>%3</title>\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-466.81 693.54,-466.81 693.54,4 -4,4\"/>\n",
       "<g id=\"clust1\" class=\"cluster\">\n",
       "<title>clusterpredictors_dim (50)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M137.69,-240.88C137.69,-240.88 497.69,-240.88 497.69,-240.88 503.69,-240.88 509.69,-246.88 509.69,-252.88 509.69,-252.88 509.69,-442.81 509.69,-442.81 509.69,-448.81 503.69,-454.81 497.69,-454.81 497.69,-454.81 137.69,-454.81 137.69,-454.81 131.69,-454.81 125.69,-448.81 125.69,-442.81 125.69,-442.81 125.69,-252.88 125.69,-252.88 125.69,-246.88 131.69,-240.88 137.69,-240.88\"/>\n",
       "<text text-anchor=\"middle\" x=\"431.19\" y=\"-248.68\" font-family=\"Times,serif\" font-size=\"14.00\">predictors_dim (50)</text>\n",
       "</g>\n",
       "<g id=\"clust2\" class=\"cluster\">\n",
       "<title>cluster__obs__ (100)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M79.69,-8C79.69,-8 185.69,-8 185.69,-8 191.69,-8 197.69,-14 197.69,-20 197.69,-20 197.69,-209.93 197.69,-209.93 197.69,-215.93 191.69,-221.93 185.69,-221.93 185.69,-221.93 79.69,-221.93 79.69,-221.93 73.69,-221.93 67.69,-215.93 67.69,-209.93 67.69,-209.93 67.69,-20 67.69,-20 67.69,-14 73.69,-8 79.69,-8\"/>\n",
       "<text text-anchor=\"middle\" x=\"142.69\" y=\"-15.8\" font-family=\"Times,serif\" font-size=\"14.00\">__obs__ (100)</text>\n",
       "</g>\n",
       "<!-- Intercept -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>Intercept</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"58.69\" cy=\"-298.38\" rx=\"58.88\" ry=\"37.45\"/>\n",
       "<text text-anchor=\"middle\" x=\"58.69\" y=\"-309.68\" font-family=\"Times,serif\" font-size=\"14.00\">Intercept</text>\n",
       "<text text-anchor=\"middle\" x=\"58.69\" y=\"-294.68\" font-family=\"Times,serif\" font-size=\"14.00\">~</text>\n",
       "<text text-anchor=\"middle\" x=\"58.69\" y=\"-279.68\" font-family=\"Times,serif\" font-size=\"14.00\">Normal</text>\n",
       "</g>\n",
       "<!-- mu -->\n",
       "<g id=\"node8\" class=\"node\">\n",
       "<title>mu</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" points=\"189.69,-213.93 75.69,-213.93 75.69,-160.93 189.69,-160.93 189.69,-213.93\"/>\n",
       "<text text-anchor=\"middle\" x=\"132.69\" y=\"-198.73\" font-family=\"Times,serif\" font-size=\"14.00\">mu</text>\n",
       "<text text-anchor=\"middle\" x=\"132.69\" y=\"-183.73\" font-family=\"Times,serif\" font-size=\"14.00\">~</text>\n",
       "<text text-anchor=\"middle\" x=\"132.69\" y=\"-168.73\" font-family=\"Times,serif\" font-size=\"14.00\">Deterministic</text>\n",
       "</g>\n",
       "<!-- Intercept&#45;&gt;mu -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>Intercept&#45;&gt;mu</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M81.5,-263.8C90.41,-250.67 100.63,-235.63 109.58,-222.46\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"112.52,-224.35 115.25,-214.11 106.73,-220.42 112.52,-224.35\"/>\n",
       "</g>\n",
       "<!-- predictors_tau -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>predictors_tau</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"604.69\" cy=\"-409.34\" rx=\"84.71\" ry=\"37.45\"/>\n",
       "<text text-anchor=\"middle\" x=\"604.69\" y=\"-420.64\" font-family=\"Times,serif\" font-size=\"14.00\">predictors_tau</text>\n",
       "<text text-anchor=\"middle\" x=\"604.69\" y=\"-405.64\" font-family=\"Times,serif\" font-size=\"14.00\">~</text>\n",
       "<text text-anchor=\"middle\" x=\"604.69\" y=\"-390.64\" font-family=\"Times,serif\" font-size=\"14.00\">Halfstudentt</text>\n",
       "</g>\n",
       "<!-- predictors -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>predictors</title>\n",
       "<polygon fill=\"none\" stroke=\"black\" points=\"373.69,-324.88 259.69,-324.88 259.69,-271.88 373.69,-271.88 373.69,-324.88\"/>\n",
       "<text text-anchor=\"middle\" x=\"316.69\" y=\"-309.68\" font-family=\"Times,serif\" font-size=\"14.00\">predictors</text>\n",
       "<text text-anchor=\"middle\" x=\"316.69\" y=\"-294.68\" font-family=\"Times,serif\" font-size=\"14.00\">~</text>\n",
       "<text text-anchor=\"middle\" x=\"316.69\" y=\"-279.68\" font-family=\"Times,serif\" font-size=\"14.00\">Deterministic</text>\n",
       "</g>\n",
       "<!-- predictors_tau&#45;&gt;predictors -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>predictors_tau&#45;&gt;predictors</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M543.11,-383.37C533.29,-379.47 523.22,-375.52 513.69,-371.86 470.41,-355.23 421.5,-337.23 383.24,-323.33\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"384.34,-320.01 373.75,-319.89 381.96,-326.59 384.34,-320.01\"/>\n",
       "</g>\n",
       "<!-- sigma -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>sigma</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"283.69\" cy=\"-187.43\" rx=\"75.82\" ry=\"37.45\"/>\n",
       "<text text-anchor=\"middle\" x=\"283.69\" y=\"-198.73\" font-family=\"Times,serif\" font-size=\"14.00\">sigma</text>\n",
       "<text text-anchor=\"middle\" x=\"283.69\" y=\"-183.73\" font-family=\"Times,serif\" font-size=\"14.00\">~</text>\n",
       "<text text-anchor=\"middle\" x=\"283.69\" y=\"-168.73\" font-family=\"Times,serif\" font-size=\"14.00\">Halfstudentt</text>\n",
       "</g>\n",
       "<!-- y -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>y</title>\n",
       "<ellipse fill=\"lightgrey\" stroke=\"black\" cx=\"136.69\" cy=\"-76.48\" rx=\"49.49\" ry=\"37.45\"/>\n",
       "<text text-anchor=\"middle\" x=\"136.69\" y=\"-87.78\" font-family=\"Times,serif\" font-size=\"14.00\">y</text>\n",
       "<text text-anchor=\"middle\" x=\"136.69\" y=\"-72.78\" font-family=\"Times,serif\" font-size=\"14.00\">~</text>\n",
       "<text text-anchor=\"middle\" x=\"136.69\" y=\"-57.78\" font-family=\"Times,serif\" font-size=\"14.00\">Normal</text>\n",
       "</g>\n",
       "<!-- sigma&#45;&gt;y -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>sigma&#45;&gt;y</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M242.35,-155.79C222.88,-141.36 199.67,-124.15 179.96,-109.55\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"181.87,-106.61 171.75,-103.46 177.7,-112.23 181.87,-106.61\"/>\n",
       "</g>\n",
       "<!-- predictors_raw -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>predictors_raw</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"413.69\" cy=\"-409.34\" rx=\"87.86\" ry=\"37.45\"/>\n",
       "<text text-anchor=\"middle\" x=\"413.69\" y=\"-420.64\" font-family=\"Times,serif\" font-size=\"14.00\">predictors_raw</text>\n",
       "<text text-anchor=\"middle\" x=\"413.69\" y=\"-405.64\" font-family=\"Times,serif\" font-size=\"14.00\">~</text>\n",
       "<text text-anchor=\"middle\" x=\"413.69\" y=\"-390.64\" font-family=\"Times,serif\" font-size=\"14.00\">Normal</text>\n",
       "</g>\n",
       "<!-- predictors_raw&#45;&gt;predictors -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>predictors_raw&#45;&gt;predictors</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M383.26,-374.16C371.47,-360.91 358.01,-345.79 346.29,-332.63\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"348.88,-330.28 339.62,-325.14 343.65,-334.93 348.88,-330.28\"/>\n",
       "</g>\n",
       "<!-- predictors_lam -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>predictors_lam</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"220.69\" cy=\"-409.34\" rx=\"86.95\" ry=\"37.45\"/>\n",
       "<text text-anchor=\"middle\" x=\"220.69\" y=\"-420.64\" font-family=\"Times,serif\" font-size=\"14.00\">predictors_lam</text>\n",
       "<text text-anchor=\"middle\" x=\"220.69\" y=\"-405.64\" font-family=\"Times,serif\" font-size=\"14.00\">~</text>\n",
       "<text text-anchor=\"middle\" x=\"220.69\" y=\"-390.64\" font-family=\"Times,serif\" font-size=\"14.00\">Halfstudentt</text>\n",
       "</g>\n",
       "<!-- predictors_lam&#45;&gt;predictors -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>predictors_lam&#45;&gt;predictors</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M250.8,-374.16C262.37,-361.04 275.55,-346.07 287.07,-333\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"290.01,-334.95 294,-325.14 284.76,-330.32 290.01,-334.95\"/>\n",
       "</g>\n",
       "<!-- predictors&#45;&gt;mu -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>predictors&#45;&gt;mu</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M273.55,-271.84C247,-256.12 212.8,-235.87 184.75,-219.26\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"186.27,-216.09 175.88,-214 182.7,-222.11 186.27,-216.09\"/>\n",
       "</g>\n",
       "<!-- mu&#45;&gt;y -->\n",
       "<g id=\"edge7\" class=\"edge\">\n",
       "<title>mu&#45;&gt;y</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M133.63,-160.89C134.03,-149.98 134.51,-136.89 134.97,-124.35\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"138.48,-124.12 135.35,-114 131.48,-123.87 138.48,-124.12\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<graphviz.graphs.Digraph at 0x7faa76bc8d60>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "priors = {\n",
    "    term_name: bmb.Prior(\"Horseshoe\", tau_nu = 3, lam_nu = 3),\n",
    "}\n",
    "model = bmb.Model(formula, df, priors=priors)\n",
    "model.set_alias({term_name: \"predictors\"})\n",
    "\n",
    "model.build()\n",
    "model.graph()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Initializing NUTS using jitter+adapt_diag...\n",
      "Multiprocess sampling (4 chains in 4 jobs)\n",
      "NUTS: [sigma, Intercept, predictors_tau, predictors_lam, predictors_raw]\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "14399e3f24154c0ab0a5e6b1698fd9fe",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Sampling 4 chains for 1_000 tune and 1_000 draw iterations (4_000 + 4_000 draws total) took 81 seconds.\n",
      "There were 57 divergences after tuning. Increase `target_accept` or reparameterize.\n"
     ]
    }
   ],
   "source": [
    "idata = model.fit(target_accept=0.97)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqcAAAIlCAYAAADonVHXAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAgKdJREFUeJzt3XeYXGXdPvD7OX1mtqR3SCItxJAECDVgQu8gHQmRJq8oKMKrIsgr5UVQQcUfUhUQFBB5AxhBSiBAEILSQklDJAkpu9k2vezMnPP8/jg7k2y2ze5O25n7c11curOz53wz2+79Pk1IKSWIiIiIiMqAUuoCiIiIiIgyGE6JiIiIqGwwnBIRERFR2WA4JSIiIqKywXBKRERERGWD4ZSIiIiIygbDKRERERGVDYZTIiIiIiobDKdEREREVDYYTmlI+8Mf/gAhRPY/TdMwadIkXHjhhdi8eXPe7xeLxXDDDTfgtddey/u1AeC1116DEKJg189F5jVdv3599rH58+dj/vz5/brOqlWrcMMNN3S6Ti52vNf69eshhMDtt9/er+v05ZZbbsEzzzzT5fFy+Bzk4s4778Suu+4KwzAghEAgECh1SdQPyWQSl156KcaPHw9VVTF79mwAQFtbG8455xyMGTMGQgh89atfBQAIIXDDDTf06x6Z750//OEPea19R4899hjuuOOOgt6DqotW6gKI8uGhhx7CtGnTEI/HsWzZMtx66614/fXX8fHHH8Pn8+XtPrFYDDfeeCMA9Dus5WKfffbB8uXLMX369LxfezDuvvvufn/MqlWrcOONN2L+/PmYMmVKQe81ELfccgvOOOOM7C//jHL9HGxvxYoV+O53v4tvfOMbOP/886FpGmpra0tdFvXDPffcg/vuuw933nkn9t13X9TU1AAA/vd//xdPP/00HnzwQeyyyy4YMWIEAGD58uWYNGlSv+4xfvx4LF++HLvsskve69/eY489hk8++QTf+973Cnofqh4Mp1QRZsyYgTlz5gAADjvsMNi2jf/93//FM888gwULFpS4ur6lUikIIVBXV4cDDzwwb9eNxWLwer2Dvk4xglqm1lKHwnx/Dgph5cqVAIBLLrkE+++/f4mrKZ3M942mDb1fZZ988gk8Hg8uv/zyLo/vsssuXX5uDeRr0jTNsv9aJuoOh/WpImV+IG/YsAEAkEgkcM0112Dq1KkwDAMTJ07EZZdd1mUodOnSpZg/fz5GjhwJj8eDnXfeGaeffjpisRjWr1+P0aNHAwBuvPHG7FSCCy64IPvx//73v3HuuedizJgxME0Te+65J+66665O98gMG//xj3/Ef//3f2PixIkwTROfffZZj0PKixcvxkEHHQSv14va2locddRRWL58eafn3HDDDRBC4P3338cZZ5yB4cOH99kxefvttzF37lxYloUJEybgmmuuQSqV6vK87ob177nnHsyaNQs1NTWora3FtGnTcO211wJwpwaceeaZANw/FjKvVWZ4cf78+ZgxYwaWLVuGgw8+GF6vFxdddFGP9wIAx3Hw05/+FDvvvDMsy8KcOXPwyiuvdHrOBRdc0G2XNvPaZAghEI1G8fDDD2dry9wzH5+DlStX4mtf+xrq6+sxduxYXHTRRQgGg13q6s6DDz6IWbNmwbIsjBgxAqeeeipWr16dff/8+fNx3nnnAQAOOOCALl+DPf3bc6kp1++TKVOm4MQTT8QLL7yAffbZBx6PB9OmTcODDz7Y5XnbT7vZ/r/tX9/Bft/k8rr1ZvPmzfiv//ov7LTTTjAMAxMmTMAZZ5yBrVu3Zp/zxRdf4LzzzutU4y9/+Us4jtPpWslkEjfffDOmTZsG0zQxevRoXHjhhWhubs4+RwiB3//+94jH452+N4QQePnll7F69eour1N3w/p91d3TsH5/Xu/HH38cP/7xjzFhwgTU1dXhyCOPxNq1a7PPmz9/Pp577jls2LCh0+c3o7efE0Q9kkRD2EMPPSQByHfeeafT47/5zW8kAHn//fdLx3HkMcccIzVNk//zP/8jX3rpJXn77bdLn88n9957b5lIJKSUUq5bt05aliWPOuoo+cwzz8jXXntNPvroo3LhwoXS7/fLRCIhX3jhBQlAXnzxxXL58uVy+fLl8rPPPpNSSrly5UpZX18v99prL/nII4/Il156Sf73f/+3VBRF3nDDDdnaXn31VQlATpw4UZ5xxhly8eLF8tlnn5Wtra3Z97366qvZ5z/66KMSgDz66KPlM888I5944gm57777SsMw5BtvvJF93vXXXy8ByMmTJ8urr75aLlmyRD7zzDM9vnYrV66UXq9XTp8+XT7++OPyr3/9qzzmmGPkzjvvLAHIdevWZZ87b948OW/evOzbjz/+uAQgv/Od78iXXnpJvvzyy/Lee++V3/3ud6WUUjY1NclbbrlFApB33XVX9rVqamrKXm/EiBFyp512knfeead89dVX5euvv97tvdatWycByJ122kkecsghctGiRfLJJ5+U++23n9R1Xb711lvZ555//vly8uTJXf6tmdcmY/ny5dLj8cjjjz8+W9vKlSs7fX4G8znYY4895E9+8hO5ZMkS+atf/UqapikvvPDCHj8XGZnX7Gtf+5p87rnn5COPPCK/9KUvyfr6evnpp59mP2/XXXedBCAfeuihTl+D3cm1ply/T6SUcvLkyXLSpEly+vTp8pFHHpEvvviiPPPMMyWA7OdRSinff//97Ou7fPly+eabb8q99tpL+nw++Z///Cf77xns900ur1tPNm3aJMePHy9HjRolf/WrX8mXX35ZPvHEE/Kiiy6Sq1evllK6X88TJ06Uo0ePlvfee6984YUX5OWXXy4ByG9961vZa9m2LY899ljp8/nkjTfeKJcsWSJ///vfy4kTJ8rp06fLWCwmpXS//o4//njp8Xiyr01jY6Ncvny53HvvveWXvvSl7OPBYFBKKSUAef311/er7sz3zkMPPZT9uP6+3lOmTJELFiyQzz33nHz88cflzjvvLHfbbTeZTqez15s7d64cN25cp8+1lH3/nCDqCcMpDWmZcPr222/LVColw+GwfPbZZ+Xo0aNlbW2tbGxszAbKX/ziF50+9oknnsgGWCml/L//+z8JQK5YsaLH+zU3N3f5JZFxzDHHyEmTJmV/mWRcfvnl0rIs2dbWJqXc9kP/K1/5Spdr7BiMbNuWEyZMkHvttZe0bTv7vHA4LMeMGSMPPvjg7GOZEPKTn/yk9xetw9lnny09Ho9sbGzMPpZOp+W0adP6DKeXX365HDZsWK/Xf/LJJ7uEvO2vB0C+8sor3b6vu3A6YcIEGY/Hs4+HQiE5YsQIeeSRR2YfyzWcSimlz+eT559/fpfn5uNzsOPX2re//W1pWZZ0HKfL/TL8fn82MG/viy++kKZpynPPPTf7WE9/lHUn15py/T6R0g2nlmXJDRs2ZB+Lx+NyxIgR8pvf/GaPtVx++eVS0zT597//PfvYYL9v+vO6deeiiy6Suq7LVatW9ficH/3oRxKA/Oc//9np8W9961tSCCHXrl0rpdwWxhYtWtTpee+8844EIO++++7sY+eff770+Xxd7jVv3jz55S9/ucvj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3/rWt7D77rsDAM455xw8+uijOP7443HFFVdg//33h67r2LRpE1599VWccsopOPXUU/v1Og6m7u4U4ufUXnvthaeeegr33HMP9t13XyiKgjlz5uT0c4KoWyVdjkU0SLmuWo7H4/Lqq6+WkydPlrquy/Hjx8tvfetb0u/3Z5+zfPlyeeqpp8rJkydL0zTlyJEj5bx58+TixYs7Xevll1+We++9tzRNUwLotOJ73bp18qKLLpITJ06Uuq7L0aNHy4MPPljefPPN2edkVsE++eSTXersbhsjKaV85pln5AEHHCAty5I+n08eccQR8s033+z0nMyq7Obm5j5etW3efPNNeeCBB0rTNOW4cePkD37wA3n//ff3uVr/4YcflocddpgcO3asNAxDTpgwQZ511lnyo48+6nT9O+64Q06dOlWqqtpp1XBPK5K7u1dmxfHPf/5zeeONN8pJkyZJwzDk3nvvLV988cUuH//3v/9dzp49W3o8HvmlL31J/va3v+12tf6KFSvk3LlzpdfrlQCy9yzE5yDzdbr9a9qT3//+93LmzJnSMAxZX18vTznllOw2Vzterz+r9XOpKZfvEynd1fonnHBCl3tt/7nLfN56+m/713ew3ze5vm492bhxo7zooovkuHHjpK7r2a/nrVu3Zp+zYcMGee6558qRI0dKXdflHnvsIW+77bZOOzhIKWUqlZK33367nDVrlrQsS9bU1Mhp06bJb37zm/Lf//539nmDXa2fS93drdbPPD7Q17u7a7a1tckzzjhDDhs2TAohst9ruf6cINqRkHK7cSoiIiIiohLinFMiIiIiKhsMp0RERERUNhhOiYiIiKhsMJwSERERUdlgOCUiIiKissFwSkRERERlY8hvwi+lRDgcLnUZRERERNSH2traPo+vHvLhNBwOo76+vtRlEBEREVEfgsEg6urqen3OkN+En51TIiIiypcf/vCHeOzdLdjr0GMRaVyPTaE0/uuI6bjmG2eVurSKUBWdUyFEnwmciIiIKBeJRAKKVQNfTR2UYSOgJEIIJ9LMGkXEBVFEREREHYLBIIRmwjINeH1eQAJtoUipy6oqDKdEREREHfyBAIRuwjR0+Lw+QDpoC8VKXVZVYTglIiIi6hAMRSAUFR7TgNfrhXRsBGPtpS6rqgz5OadEVDmklEin07Btu9SlUJlQVRWapvW5gIIoX4KR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DutblgXp2Eim0mhn95SIiKpAIBCAUHUYlgVN2RafLNPdkD8U6f+pia+//joA4OCDD+7YCSf/DjvsMADA4sWLC3L9QmA4pY45pxY8Zm7fGJZlAXYaybSNeDJd4OqIiIhKL9M51Q0T259XM5hTE//+978DAObPn9/pcSFtTAq+hz2aX8Sk4HvujgADdMYZZwAAXn75ZXz++ecDvk4xlTycLlu2DCeddBImTJgAIQSeeeaZUpdUdYKhMBTNcCd158CyLEjpAEJBayBU4OqIiIhKL9s53eHAGtM0ASEQ6eepiVu3bsVLL70EADjttNOyj8+OLMPF756MMz+5FMd/eh3O/ORSXPzuydi1demA6t5jjz1w1FFHIZ1O4/TTT0djY2P2faFQef4OL3k4jUajmDVrFn7729+WupSqFYrEAKFmNxXui6ZpUIUEFBUtbcECV0dERFR6bue064E17t7fEuF47nt/O46Da6+9FqlUCgceeCCmT58OABi3+SX819YbUJNs6vT8mmQTTlxz9YAD6t13342xY8dixYoVmDNnDm6//XbMnTsXhxxySFmuHclt1/UCOu6443DccceVuoyqForGYCoqLNPs+8kdLENHu6KiJcBwSkRElc/v93e7J3hm7+/uTk3829/+hksuuQRTp07FHnvsgd133x2bN2/G4sWLsWnTJgDAddddh2g0Cjg29vzwpwCAHQ8SFwAkgHmf/xJrag+CFL3vrpO2HaTTacRicUSjCsaPH48XX3wRZ511Fj799FP84Ac/AACoqoo1a9Zgzz33HNBrUiglD6dUWqlUColkGpaiwOvJPZwahoF2oaItGC5gdUREROUhEAgA3XRO3R1sHMTau67BWL16NbZu3YqtW7fi7bff7va6J554IgBg3mQVr13g6/H+AkBdsgnLHrwBb4bG9lqrUFQoVg0euOoxpFs39fg827ax884793qtUij5sD6VVigUAlS904kXufBY7upEP8MpERFVgW2nKXY3rG8j3s2piQsXLsz5+uNrd+yXdm+clYRQtV7/gxCwI37IVHvO9y8n7JxWOXdTYR2arkNXc/9ysCwLaE/BH4oUsDoiIqLyEAqFIPSu2y66w/rdH0wzbtw4RCK5/Z5UvngLeOKMPp9324++i1smHdT39QRg6b/u83lerzen+oqJ4bTKZf8SNCxoSm5/tQEd4TSYQiDc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FULVUFfjG9S16uvrASGxuak1T9URERERlS+G0wJoaGiA0C0YHh88g1itDwDDhg0DHAdb/ZH8FEdERERUxnh8aQE0NDRAMTzw+Gqga4M7erS+vh4ynUJLxMlTdURERETli53TAmhsbIQwPLAsDzRlcC/xsGHDINNJhNptpHhKFBEREVU4htMC2LBhA4SiwuPxDPpa9fX1kE4aaUdiy9bmPFRHREREVL4YTgvg888/BwDU1NQM+lqapqGutg4AsGbNmkFfj4iIiKicMZwWQCac+nyDW6mfMWLkCADAqlWr8nI9IiIionLFcFoA//nPfwDkP5yuXr06L9cjIiIiKlcMp3nW3t6OTZs2AchfOB05fCQAdk6JiIio8jGc5tnatWshpYSvpgaWZeXlmiO3G9aXUublmkRERETliOE0zz755BMAwJemTs3bNYcPHwFFKAgEAvjiiy/ydl0iIiKicsNwmmcrV64EAEyZOiVv11Q1FcNHuN3Td999N2/XJSIiIio3DKd5tq1z+qW8Xnf06NEAgHfeeSev1yUiIiIqJwyneZbtnE6ZktfrZsIpO6dERERUyRhO8ygWi2X3OJ36pcJ0Tt99913YNo8xJSIiosrEcJpHq1evhpQSo0aNwvBhw/J67REjhqO2thbBYBDvvfdeXq9NREREVC4YTvMoM990xowZeb+2IhQcfvjhAIDnn38+79cnIiIiKgcMp3mUmW9aiHAKAEcddRQAhlMiIiKqXAyneZQZbp85c2ZBrp8Jp//85z+xcePGgtyDiIiIqJQYTvPEtm3861//AgAceOCBBbnHhAkT8JWvfAUA8Oc//7kg9yAiIiIqJYbTPPn4448RiURQU1OD6dOnF+w+CxYsAAA88sgjPMqUiIiIKg7DaZ489dRTAIAjjjgCqgBqG9/GnPArmBR8D0Lmb+unM888E16vF5988gleffXVvF2XiIiIqByUVTi99dZbIYTA9773vVKX0i8tLS247777AABXHbcbcMcMTH/pXFy89ac485NLcfG7J2PX1qV5udfw4cNx0UUXAQB+9atf5eWaREREROWibMLpO++8g/vvv79gi4kKwXEc/Pa3v8X06dPR1NSEbx82CYc2/A4Iben0vJpkE05cc3XeAuoVV1wBIQSee+45rFmzJi/XJCIiIioHWqkLAIBIJIIFCxbgd7/7HW6++eZSl9MjKSXuv/9+rF27Fvvttx8efvhhvPjiiwCAXb40Bb86SgHau84DFQAkgHmf/xJrag+CFGq/7ptOpZCyJaKxKJDWMH78eJxwwgl49tlnsWDBAsyZMwfxeBwPP/wwhBB5+JcSERERlYaQZbCq5vzzz8eIESPw61//GvPnz8fs2bNxxx13lLqsLqLRKGpqarp937zJKl67wNfnNU5870D8wz+qX/dVrFoITYN/6QOQqUSPz/P7/RiW55OpiIiIiIqp5J3TP//5z3j//ffxzjvvlLqUQRlfm1vHcsLIWujqzv26tmJ4kA40wu2/9sy287fwioiIiKgUShpON27ciCuuuAIvvfQSLMsqZSk58Xq9iEQi3b5P+eIt4Ikz+rzGN877Gk4bvV//722o2GenX/Q6bO/1evt9XSIiIqJyUtJh/WeeeQannnoqVHXbHEzbtiGEgKIoaG9v7/S+subYwB0zgFADuu9wCqBuAvC9jwFliPybiIiIiIqspOE0HA5jw4YNnR678MILMW3aNFx99dUFO6O+YFYtBv7y9Y43tn9ZO7qdZz0CTD+52FURERERDRklHdavra3tEkB9Ph9Gjhw59IIp4AbPsx4BXri683ZSdROAY3/GYEpERETUh5IviKo4008Gpp0AbHgLiGwFasYCkw/mUD4RERFRDspiKykiIiIiIqCMTogiIiIiImI4JSIiIqKywXBKRERERGWD4ZSIiIiIygbDKRERERGVDYZTIiIiIiobDKdEREREVDYYTomIiIiobDCcEhEREVHZYDglIiIiorLBcEpEREREZYPhlIiIiIjKBsMpEREREZUNhlMiIiIiKhsMp0RERERUNhhOiYiIiKhsMJwSERERUdlgOCUiIiKissFwSkRERERlg+GUiIiIiMoGwykRERERlQ2GUyIiIiIqGwynRERERFQ2GE6JiIiIqGwwnBIRERFR2WA4JSIiIqKywXBKRERERGWD4ZSIiIiIygbDKRERERGVDYZTIiIiIiobWqkLGCwpJcLhcKnLICIiIqI+1NbWQgjR63OGfDgNh8Oor68vdRlERERE1IdgMIi6urpenyOklLJI9RQEO6fbhEIh7LTTTti4cWOfn3jqjK/dwPG1Gxy+fgPH127g+NoNHF+7wamKzqkQgl8cO6irq+NrMkB87QaOr93g8PUbOL52A8fXbuD42hUOF0QRERERUdlgOCUiIiKissFwWkFM08T1118P0zRLXcqQw9du4PjaDQ5fv4HjazdwfO0Gjq9d4Q35BVFEREREVDnYOSUiIiKissFwSkRERERlg+GUiIiIiMoGwykRERERlQ2G0wr33HPP4YADDoDH48GoUaNw2mmnlbqkIaW9vR2zZ8+GEAIrVqwodTllb/369bj44osxdepUeDwe7LLLLrj++uuRTCZLXVpZuvvuuzF16lRYloV9990Xb7zxRqlLKnu33nor9ttvP9TW1mLMmDH46le/irVr15a6rCHp1ltvhRAC3/ve90pdypCwefNmnHfeeRg5ciS8Xi9mz56N9957r9RlVSSG0wq2aNEiLFy4EBdeeCE+/PBDvPnmmzj33HNLXdaQ8sMf/hATJkwodRlDxpo1a+A4Du677z6sXLkSv/71r3Hvvffi2muvLXVpZeeJJ57A9773Pfz4xz/GBx98gEMPPRTHHXccvvjii1KXVtZef/11XHbZZXj77bexZMkSpNNpHH300YhGo6UubUh55513cP/992PmzJmlLmVI8Pv9mDt3LnRdx/PPP49Vq1bhl7/8JYYNG1bq0ioSt5KqUOl0GlOmTMGNN96Iiy++uNTlDEnPP/88rrrqKixatAhf/vKX8cEHH2D27NmlLmvIue2223DPPffg888/L3UpZeWAAw7APvvsg3vuuSf72J577omvfvWruPXWW0tY2dDS3NyMMWPG4PXXX8dXvvKVUpczJEQiEeyzzz64++67cfPNN2P27Nm44447Sl1WWfvRj36EN998k6MbRcLOaYV6//33sXnzZiiKgr333hvjx4/Hcccdh5UrV5a6tCFh69atuOSSS/DHP/4RXq+31OUMacFgECNGjCh1GWUlmUzivffew9FHH93p8aOPPhpvvfVWiaoamoLBIADwa6wfLrvsMpxwwgk48sgjS13KkLF48WLMmTMHZ555JsaMGYO9994bv/vd70pdVsViOK1QmS7VDTfcgOuuuw7PPvsshg8fjnnz5qGtra3E1ZU3KSUuuOACXHrppZgzZ06pyxnS/vOf/+DOO+/EpZdeWupSykpLSwts28bYsWM7PT527Fg0NjaWqKqhR0qJq666CocccghmzJhR6nKGhD//+c94//332Z3vp88//xz33HMPdtttN7z44ou49NJL8d3vfhePPPJIqUurSAynQ8wNN9wAIUSv/7377rtwHAcA8OMf/xinn3469t13Xzz00EMQQuDJJ58s8b+iNHJ97e68806EQiFcc801pS65bOT62m1vy5YtOPbYY3HmmWfiG9/4RokqL29CiE5vSym7PEY9u/zyy/HRRx/h8ccfL3UpQ8LGjRtxxRVX4E9/+hMsyyp1OUOK4zjYZ599cMstt2DvvffGN7/5TVxyySWdpuVQ/milLoD65/LLL8c555zT63OmTJmCcDgMAJg+fXr2cdM08aUvfalqF1zk+trdfPPNePvtt7ucmzxnzhwsWLAADz/8cCHLLEu5vnYZW7ZswWGHHYaDDjoI999/f4GrG3pGjRoFVVW7dEmbmpq6dFOpe9/5znewePFiLFu2DJMmTSp1OUPCe++9h6amJuy7777Zx2zbxrJly/Db3/4W7e3tUFW1hBWWr/Hjx3f6fQq4c8QXLVpUoooqG8PpEDNq1CiMGjWqz+ftu+++ME0Ta9euxSGHHAIASKVSWL9+PSZPnlzoMstSrq/d//t//w8333xz9u0tW7bgmGOOwRNPPIEDDjigkCWWrVxfO8DdbuWwww7LdusVhQM0OzIMA/vuuy+WLFmCU089Nfv4kiVLcMopp5SwsvInpcR3vvMdPP3003jttdcwderUUpc0ZBxxxBH4+OOPOz124YUXYtq0abj66qsZTHsxd+7cLluWffrpp1X7+7TQGE4rVF1dHS699FJcf/312GmnnTB58mTcdtttAIAzzzyzxNWVt5133rnT2zU1NQCAXXbZhR2aPmzZsgXz58/HzjvvjNtvvx3Nzc3Z940bN66ElZWfq666CgsXLsScOXOyHeYvvviC83P7cNlll+Gxxx7DX//6V9TW1ma7z/X19fB4PCWurrzV1tZ2mZvr8/kwcuRIztntw5VXXomDDz4Yt9xyC8466yz861//wv3338+RoQJhOK1gt912GzRNw8KFCxGPx3HAAQdg6dKlGD58eKlLowr10ksv4bPPPsNnn33WJchz17rOzj77bLS2tuKmm25CQ0MDZsyYgb///e/sxPQhM8dv/vz5nR5/6KGHcMEFFxS/IKoK++23H55++mlcc801uOmmmzB16lTccccdWLBgQalLq0jc55SIiIiIygYngxERERFR2WA4JSIiIqKywXBKRERERGWD4ZSIiIiIygbDKRERERGVDYZTIiIiIiobDKdEREREVDYYTomIiIiobDCcEhEREVHZYDglIiIiorLBcEpEVCYefvhhTJ8+HV6vF9OmTcOzzz5b6pKIiIqO4ZSIqAw8/fTTuOyyy3Ddddfhk08+wXHHHYdLL7201GURERWdkFLKUhdBRFTtDjnkEBx++OG46aabAABLlizBmWeeiUAgUNrCiIiKjJ1TIqISC4fDWL58OU444YTsYy+88AJmz55duqKIiEpEK3UBRETV7sMPP4QQAjNnzkQsFsOjjz6KO++8E4sWLSp1aURERcdwSkRUYitWrMC0adOwYsUKHHzwwQCAU089NdtJffnll/Hxxx/jyiuvLGWZRERFwTmnREQl9o1vfAPt7e24++67sXr1aixfvhw//vGPceWVV+J///d/S10eEVFRcc4pEVGJrVixAnvvvTdqa2ux//7744orrsDChQvx9ttvAwCOO+44rF69usRVEhEVB8MpEVEJpdNprFy5EtOmTev0+IcffohDDz0UAPDvf/8bu+22WynKIyIqOs45JSIqoTVr1iCRSODmm2/G+PHj4fV6cc8992DdunW45JJLEAwGUVNTA03jj2siqg78aUdEVEIrVqzA+PHj4fP5cOihh8Ln8+GQQw7Bq6++ivHjx+PNN9/El7/85VKXSURUNAynREQltGLFChxwwAF4+umnu33/J598ghkzZhS5KiKi0uGcUyKiElqxYgVmzpzZ4/tXrlzJcEpEVYVbSRERldDo0aNx77334vTTTy91KUREZYHhlIiIiIjKBof1iYiIiKhsMJwSERERUdlgOCUiIiKissFwSkRERERlg+GUiIiIiMoGwykRERERlQ2GUyIiIiIqGwynRERERFQ2GE6JiIiIqGwwnBIRERFR2fj/GXbX0W/YFyIAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 800x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ax, = az.plot_forest(\n",
    "    idata, \n",
    "    var_names=[\"predictors\"], \n",
    "    coords={\"predictors_dim\": range(D0)},\n",
    "    kind='ridgeplot',\n",
    "    ridgeplot_truncate=False, \n",
    "    ridgeplot_alpha=0.5,\n",
    "    hdi_prob=0.95, \n",
    "    combined=True,\n",
    "    figsize=(8, 6)\n",
    ")\n",
    "ax.scatter(COEF[:D0][::-1], ax.get_yticks(), c='C1', label=\"Actual value\");\n",
    "ax.set_xlabel(r\"$\\beta_i$\");\n",
    "ax.set_ylim(bottom=None, top=1.55 * ax.get_yticks().max())\n",
    "ax.set_yticklabels(range(D0)[::-1]);\n",
    "ax.set_ylabel(r\"$i$\");\n",
    "ax.legend(loc='upper center');\n",
    "ax.set_title(\"Posterior distribution of nonzero coefficients\");"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Last updated: Sun Sep 28 2025\n",
      "\n",
      "Python implementation: CPython\n",
      "Python version       : 3.13.7\n",
      "IPython version      : 9.4.0\n",
      "\n",
      "numpy : 2.3.3\n",
      "arviz : 0.22.0\n",
      "pandas: 2.3.2\n",
      "bambi : 0.14.1.dev57+g7b2bb342c.d20250928\n",
      "\n",
      "Watermark: 2.5.0\n",
      "\n"
     ]
    }
   ],
   "source": [
    "%load_ext watermark\n",
    "%watermark -n -u -v -iv -w"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "dev",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
